package hw_8_1.reflect_Demo2;


import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception {
        Person p = new Person("zhangSan",23);
        /**
         * 调用set方法，将p对象的属性"age"的值设置为24。
         * 该方法会动态调用Person类中对应的setter方法来完成属性值的修改
         */
        set(p,"age",24);
        System.out.println(p);
    }

    public static void set(Object obj,String propertyName,Object value) throws Exception {
        Class c = obj.getClass();//调用getClass()方法获取obj对象的运行时类（Class对象）。
        /**
         *1、propertyName.substring(0,1)：通过substring()方法，取出属性名称的首字母。
         *2、.toUpperCase()：将首字母转换为大写形式，以符合Java方法命名的规范。
         *3、propertyName.substring(1,propertyName.length())：获取属性名称除首字母外的部分。
         *4、使用字符串连接符+将上述结果拼接在一起，最后得到一个类似于"setXXX"的字符串，其中XXX是首字母大写并拼接上剩余的属性名称部分。
         */
        String className = "set" + propertyName.substring(0,1).toUpperCase() +
                propertyName.substring(1,propertyName.length());
        /**
         *1、getMethod(className, int.class) 方法通过类名和参数类型获取类中的方法对象。其中：
         *2、className 是属性的setter方法名，例如 “setAge”。
         *3、int.class 是参数类型，表示期望找到的setter方法的参数类型是 int。
         */
        Method m = c.getMethod(className,int.class);
        /**
         * 使用获取到的方法对象m，调用该方法并传入参数。即调用obj对象的指定属性的setter方法，并将新的属性值value作为参数传入。
         */
        m.invoke(obj,value);
    }
}
